package 中等.数学;

/**
 * 给你一个二维整数数组 circles ，其中 circles[i] = [xi, yi, ri] 表示网格上圆心为
 * (xi, yi) 且半径为 ri 的第 i 个圆，返回出现在 至少一个 圆内的 格点数目 。
 * 注意：
 * 格点 是指整数坐标对应的点。
 * 圆周上的点 也被视为出现在圆内的点。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/count-lattice-points-inside-a-circle
 */
public class 统计圆内格点数目_6042 {

    public static void main(String[] args) {

        int[][] nums = {{8, 9, 6}, {9, 8, 4}, {4, 1, 1}, {8, 5, 1}, {7, 1, 1}, {6, 7, 5}, {7, 1, 1}, {7, 1, 1}, {5, 5, 3}};
        System.out.println(countLatticePoints(nums));

    }

    /**
     * 1 <= xi, yi <= 100
     * 因为坐标范围不大，可以枚举所有的坐标，
     * 是否存在其中一个圆里面，
     * 因为只枚举一次，不会出现重复计算的问题
     * 三角形的勾股定理： a2 + b2 = c2 ，判断是否该枚举坐标是否在圈内
     * 1 <= ri <= min(xi, yi) 所以 坐标的范围  0<=x<=200 0<=y<=200
     */
    public static int countLatticePoints(int[][] circles) {
        int ans = 0;
        for (int x = 0; x <= 200; x++) {
            for (int y = 0; y <= 200; y++) {
                boolean flag = false;
                for (int[] circle : circles) {
                    int a = Math.abs(circle[0] - x);
                    int b = Math.abs(circle[1] - y);
                    int r = circle[2];
                    if (a * a + b * b <= r * r) {
                        flag = true;
                        break;
                    }
                }
                if (flag) ans++;
            }
        }
        return ans;
    }

}
